# 래퍼 객체

🔗 🔗

래퍼 객체(Primitive wrapper objects)를 이용해 원시값도 객체 안 프로퍼티를 사용할 수 있다.

원시 값에 메서드를 호출하려 하면 임시 객체가 만들어 지지만 JS 엔진의 훌륭한 내부 최적화로 매서드를 호출해도 많은 리소스를 쓰지 않음.

let str1 = new String('str1');
let str2 = 'str2';

typeof str1; // object
typeof str2; // string

st1 instanceof String; // true
st2 instanceof String; // false

str1 instanceof Object; // true
str2 instanceof Object; // false
1
2
3
4
5
6
7
8
9
10
11

# Primitive wrapper objects 의 종류

  • String : string primitive wrapper object.
  • Number : number primitive wrapper object.
  • Boolean : Boolean primitive wrapper object.
  • Symbol : Symbol primitive wrapper object.

'valueOf()' 래퍼객체에서 감싼 원시값으로 접근하는 방법

by 준일님. 원시값을 객체 형태로 변환해 주는 것 같다.

console.log(Object(1), Object(''), Object(true), Object(null), Object(undefined));
// Nuber {1}, String {""}, {Boolean {true}, {} {}
1
2

# 원시 값과, 객체를 분리한 이유

  • 원시값은 가능한 빠르고 가벼워야함
  • 원시값을 다루는 일은 메서드를 사용하면 수월하다.

# String/Number/Boolean 을 생성자로 쓰지 말자.

typeof 0; // 'number'
typeof new Number(0); // object
1
2

논리 평가 시 항상 참을 반환

let zero = new Number(0);
if (zero) // 변수 zero는 객체이므로, 조건문이 참이된다. 
    alert('그런데 여러분은 zero가 참이라는 것에 동의하나요? ')
1
2
3

# String/Number/Boolean 생성자 없이 사용

인수를 원하는 형의 원시값(문자열, 숫자, 불린 값)으로 변환

let num = Number("123");
1

# null / undefined 의 메서드는 없다.

# 문자열에 프로퍼티 추가

let str = 'hello';
str.test = 5;
alert(str.test);
1
2
3

str 의 프로퍼티에 접근하려 하면 '래퍼 객체'가 만들어 진다.

# 엄격모드

래퍼객체를 수정하려 할 때 에러 발생

# 비엄격모드

래퍼 객체에 test 프로퍼티가 추가 되지만, 래퍼객체는 바로 삭제되기 때문에 마지막줄이 실행될 땐 test 를 찾을 수 없다.

# 심화 TODO

JS의 내부 래퍼객체 동작원리.